import simpy
from config.simulation_params import SIMULATION_TIME, RANDOM_SEED
from config.warehouse_config import WAREHOUSE_CAPACITY, WAREHOUSE_LOCATION
from models.processes import SimProcess
from storage.interface import clear_dbdata




""" 

完整流程的剖析  

-----=============================================================================-----------
-----|                               Truck station                               |-----------
-----=============================================================================-----------
----------||-----||-----||-----||-----||-----||-----||-----||------||------------------------
----------||-----||-----||-----||-----||-----||-----||-----||------||------------------------
-----=============================================================================---------- 
-----|  |en1|  |en2|  |en3|  |en4|  |en5|  |en6|  |en7|  |en8|   |en9|          |-----------
-----=============================================================================-----------
-----=============================================================================-----------
-----|                               Type Sort                                   |-----------
-----=============================================================================-----------
-----===============                 ===============               ===============-----------
-----|   normal    |                 |   danger    |               |    cold     |-----------
-----===============                 ===============               ===============-----------
---------||--------------------------------------||------------------------||----------------
---------||--------------------------------------||------------------------||----------------
-----=====================================-------||------------------------||----------------
-----|      nomal Sort                   |-------||------------------------||----------------
-----| --------------------------------- |-------||------------------------||----------------
-----|                       |           |-------||------------------------||----------------
-----|     machine           | man       |-------||------------------------||----------------
-----|                       |           |-------||------------------------||----------------
-----|                       |           |-------||------------------------||----------------
-----=====================================-------||------------------------||----------------
------- o o o o o o o o o o o o o o o -----------||------------------------||----------------
------------------------------------------=================----------------||----------------
------------------------------------------| danger  Sort  |----------------||----------------
------------------------------------------| ------------  |----------------||----------------
------------------------------------------|               |----------------||----------------
------------------------------------------| machine  man  |----------------||----------------
------------------------------------------|               |----------------||----------------
------------------------------------------=================----------------||----------------
------------------------------------------- o o o o o o o  ----------------||----------------
-------------------------------------------------------------------=================---------
-------------------------------------------------------------------|  cold   Sort  |---------
-------------------------------------------------------------------| ------------  |---------
-------------------------------------------------------------------|               |---------
-------------------------------------------------------------------| machine  man  |---------
-------------------------------------------------------------------|               |---------
-------------------------------------------------------------------=================---------
-------------------------------------------------------------------- o o o o o o o ----------
--------============================================================================--------- 
--------|       |ex1|        |ex2|        |ex3|        |ex4|         |ex5|         |---------
--------============================================================================---------
------------------||-----------||----------||-----------||------------||---------------------
------------------||-----------||----------||-----------||------------||---------------------
--------=============================================================================--------
--------|                               Truck station                               |--------
--------=============================================================================--------




Truck station:卡车停靠站

||：流转通道

en:入口

Type Sort:品类筛选关卡
    Normal :普通分类存放池
    Danger :危险品分类存放池
    Cold :冷藏分类存放池  

nomal Sort:代表普通品类的分类（主要是按照地区分类，最总决定送往哪个ex）
danger Sort:代表危险品类的分类（主要是按照地区分类，最总决定送往哪个ex）
cold Sort:代表危险品类的分类（主要是按照地区分类，最总决定送往哪个ex）

machine  ：分类中的一种分类手段，这块是机器分类，针对一些规范的易检查的信息（比如方正的快递单）
man ：分类中的一种手段，主要是机器分类失败的，需要人工进行分类

o:代表无人运送车临时取货点，无人运输车在这将分类好的物品送到对应的ex中

ex:出口


卡车停靠站:有容量限制，到达警戒容量之后需要报警，达到容量之后需要进入停靠站

流转通道：货物的流转，无容量限制

入口：会触发容量检查（检查品类筛选关卡的容量），超出的话就不可以继续卸货，卸货完成之后，卡车离开停靠站

品类筛选关卡：根据货物类型进行筛选（危险品、普通、冷藏），有容量限制，超出的话就不可以继续放入

分类存放池：根据货物类型进行分类存放，有容量限制

机器分类器：也需要有容量限制，超出的话就不可以继续放入，有一个识别率，识别了的标识到出口，放到出口的临时存放区o等待无人车运输，不可识别的直接转入人工识别

人工识别：需要有容量限制，超出的话就不可以继续放入，最终输出到出口的临时存放区o等待无人车运输

临时取货点：有容量限制，超出的话就不可以继续放入

出口:有容量限制，到达警戒容量之后需要报警，达到容量之后需要停止发货，直到仓库容量小于警戒容量之后才能继续发货





1.卡车进入卡车停靠站，等待卸货。每次进入停靠站，停靠站都需要查看是否有空余车位可以停靠，fifo原则
2.卡车进入en（货物入口处）卸货，卸货完成之后，卡车离开停靠站
3.en将货物放入品类筛选关卡，每次放入都会进行容量检查，超出则禁止放入
4.首先经过机器进行类型筛选，分类到不同的分类存放池，每次放入都会触发分类池的容量检查，超出的话就不可以继续放入 
5.每个品类都先进行机器筛选，然后有一个识别率，识别后放入识别临时存放点，不识别的重新进入人工筛选，最终也放入临时停放点
6.无人车运送到出口处，出口处也有容量限制，超出的话就不可以继续放入
7.出口处卡车装货运走
8.卡车进入的卡车停靠站，不可无限制进入，需要等待停靠站有空位



卡车停靠站：容量限制，预警容量
卡车：装货容量，装货时间，卸货时间
en：检测分类存放池的容量限制
分类存放池：容量限制，预警容量
机器筛选器：容量限制，预警容量，筛选单位时间，筛选率
人工筛选：容量限制，预警容量，筛选单位时间
临时取货点：容量限制，预警容量
无人运输车：装货容量，装货时间，运输时间，卸货时间
ex：检测出口是否有效


"""
from storage import *
from visualization import *
import threading



def main():
    print("Hello from warehouse-simulation!")
    monitor:RealtimeMonitor =RealtimeMonitor(update_interval=100)
    interface:WarehouseMonitorInterface=WarehouseMonitorInterface(monitor=monitor)
    # #================================
    # # 仿真启动逻辑
    # def test_run(env: simpy.Environment):
    #     while True:
    #         yield env.timeout(100)
    #         print(f"Time: {env.now}")
    # env.process(test_run(env))
    # #================================
    # 运行模拟
    #env.run(until=SIMULATION_TIME)
    # 在单独线程中运行仿真，让主线程处理GUI
    def run_simulation():
        try:
            clear_dbdata()
            # 创建唯一的模拟环境
            env = simpy.Environment()
            # 创建仿真处理核心类
            sim_process=SimProcess(env=env)
            # 启动仿真
            sim_process.run()
            def loop_collect_data(env: simpy.Environment):
                while True:
                    yield env.timeout(2)
                    interface.collect_simulate_data(sim_process.sim_obj_manager,env.now)
            env.process(loop_collect_data(env))
            env.run(until=SIMULATION_TIME)
            print("仿真完成")
        except Exception as e:
            print(f"仿真错误: {e}")

      # 启动仿真线程
    simulation_thread = threading.Thread(target=run_simulation, daemon=True)
    simulation_thread.start()

    # 给仿真线程一些时间启动
    import time
    time.sleep(1)


    # 在主线程中显示GUI - 这会阻塞主线程直到窗口关闭
    monitor.show()


if __name__ == "__main__":
    main()

 